
// 2.声明并使用路由器对象
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import routes from './routes.js'

// 拿到token和userInfo
import store from '@/store/index.js'

//将原有的push方法 保存起来
const originPush = VueRouter.prototype.push   

// 将原有的replace方法  保存起来
const originReplace = VueRouter.prototype.replace

// 修改原型的push 让原型push指向另外一个函数
VueRouter.prototype.push = function(location,onResolved,onRejected){
    // location是我们调用 this.$router.push 传递过来的对象

    if(onResolved === undefined && onRejected === undefined){
        // 调用的时候 只传递了匹配路由对象 没有传递成功或者失败的回调
        return originPush.call(this,location).catch(()=>{})
    }else{
        // 调用的时候 传了成功或失败的回调 或者都有
        return originPush.call(this,location,onResolved,onRejected)
    }
}

// 修改原型上的replace 让原型replace指向另外一个函数
VueRouter.prototype.replace = function(location,onResolved,onRejected){
    if(onResolved === undefined &&  onRejected === undefined){
        // 调用的时候 只传递了匹配路由对象 没有传递成功或失败的回调
        return originReplace.call(this,location).catch(()=>{})
    }else{
        // 调用的时候 传递了成功或失败的回调 或者都有
        return originReplace.call(this,location,onResolved,onRejected)
    }
}

// 3.创建一个路由对象
const router  =  new VueRouter({
    routes,  // 路由模块化
    // 控制滚动行为  跳转到新的路由界面 滚动条的位置
    scrollBehavior (to, from, savedPosition) {
        return { x: 0, y: 0 }
    }
})

// 注册全局前置导航守卫  用来对token校验（根据token获取用户信息）
router.beforeEach(async (to,from,next)=>{
    // 校验token是 发送请求 拿到用户信息
    // 1.先去获取用户的token和用户的信息
    let token = store.state.user.token
    let userInfo = store.state.user.userInfo.name
    // console.log(token);
    // 2.token
    if(token){  // token存在
        if(to.path === '/login'){  // 跳转路径为 login
            // 用户已经登录 还往login界面跳  没变要  直接重定向到 home 界面
            next('/')  
        }else{ // 用户已登录 跳转的不是 登录页面
            if(userInfo){ // 用户存在
                next()  // 放行
            }else{  
                // 用户已登录 用户信息还没获取 请求获取用户信息
                try {
                    // 获取用户信息成功 无条件放行
                    await store.dispatch('user/getUserInfo')
                    // alert('获取用户信息成功')
                    next()   // 放行
                } catch (error) {
                    // 用户信息获取失败 token可能过期  清楚过期的 token
                    store.dispatch('user/clearToken')
                    alert('clearToken')
                    // 跳转到login  重新登录
                    next('/login')
                }
            }
        }
    }else{ // 用户没登录  
        
        let targetPath = to.path 
        let targetName = to.name
        // console.log(from.path,targetPath,targetName);
        // 这里需要对跳转的目标路径进行拦截  
        // 如果跳转的是 交易相关 支付相关  个人中心相关  即：  /trade  /pay /paysuccess /center 则进行拦截
        // 这里是将需要拦截的路由路径 进行命名
        if(targetName === 'myorder' || targetName === 'trade' || targetName==='pay' || targetName ==='paysuccess' || targetName === 'center'){
            
            // 这里跳转到登录界面 需要做一个判断 避免死循环
            if(targetPath.path === '/login'){
                next()   // 如果跳转到登录界面  则直接放行
            }else{  // 
                // next('/login')
                // console.log('111'+targetPath);
                next('/login?redirect='+targetPath)  // 这里直接跳转到 登录界面  并且携带目标路径 
            }
        }else{
            // 不是上面的路径 则直接进行 放行 跳转
            next()
        }
        
        
        
        
    }
})

// 暴露一个路由对象
export default router